/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pooproj.regra;

import java.util.ArrayList;
import pooproj.basica.Cliente;
import pooproj.erro.AllgemeinException;
import pooproj.erro.ConexaoException;
import pooproj.erro.ConsultaException;
import pooproj.repositorio.RepositorioCliente;
import pooproj.repositorio.RepositorioClienteImpl;

/**
 *
 * @author Daniella
 */
public class RNCliente {
    
    private RepositorioCliente rep;
    
    public RNCliente(){
        rep = new RepositorioClienteImpl();
    }
    
    /**
     * Para função de inserir novo cliente
     * Valida se nome foi preenchido corretamente
     * @param c
     * @throws AllgemeinException
     */
    public void valida(Cliente c) throws AllgemeinException{
        if(c.getValido()!=null){
            throw new AllgemeinException("emptyfield",c.getValido());
        }
        
        if(c.getNomeCliente().trim().length()<3){
            throw new AllgemeinException("invalidvalue");
        }
    }
    
    /**
     * Para função de inserir novo cliente
     * Verifica se registro já existe
     * Utiliza método self consulta()
     * @param c
     * @throws AllgemeinException
     */
    public void verificaRedundancia(Cliente c) throws AllgemeinException, Exception{
        if(consulta(c.getNomeCliente())!=null){
            throw new AllgemeinException("taken");
        }
    }
    
    /**
     * Para função de inserir novo cliente
     * inclui registro cliente
     * @param c
     * @throws AllgemeinException
     */
    public void cadastra(Cliente c) throws AllgemeinException{
        try{
            rep.inserir(c);
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database"); 
        }
    }
    
    /**
     * Verifica se cliente informado existe no BD
     * Auxilia a utilização de alguns dos demais métodos
     * @param c
     * @throws AllgemeinException
     */
    public void verificaExiste(Cliente c) throws AllgemeinException, Exception{
        if(consulta(c.getCodCliente())==null){
            throw new AllgemeinException("notfound");
        }
    }
    
    /**
     * Para função de consulta cliente
     * Varre registros e retorna cliente
     * @param nome
     * @return Cliente
     * @throws AllgemeinException
     */
    public Cliente consulta(String nome) throws AllgemeinException, Exception{
        Cliente c;
        try{
            c = rep.consultar(nome); 
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return c;
    }
    
    /**
     * Para função de consulta cliente
     * Varre registros e retorna cliente
     * @param id
     * @return Cliente
     * @throws AllgemeinException
     */
    public Cliente consulta(int id) throws AllgemeinException, Exception{
        Cliente c;
        try{
            c = rep.consultar(id); 
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return c;
    }
    
    /**
     * Para função de atualizar Cliente
     * @param c
     * @throws AllgemeinException
     */
    public void altera(Cliente c) throws AllgemeinException{
        try{
            rep.alterar(c);
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
    }
    
    /**
     * Para função de gerar lista de clientes
     * @return list
     * @throws AllgemeinException
     */
    public ArrayList<Cliente> lista() throws AllgemeinException{
        ArrayList<Cliente> list;
        try{
            list = rep.listar();
            
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
        return list;
    }
    
    /**
     * Para função excluir cadastro de cliente
     * @param c
     * @throws AllgemeinException
     */
    public void exclui(Cliente c) throws AllgemeinException{
        try{
            rep.excluir(c);
        } catch (ConexaoException | ConsultaException e){
            throw new AllgemeinException("database");
        }
    }
}
